#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "patient.h"

/*********************************************************************************************************************************************/
/*Fonction pour tester l'unicité d'une CIN (type date)*/
/*********************************************************************************************************************************************/
int comparer_cin(patient *pa)
{ FILE *f;
  patient p;
  int res=0;
  f=fopen("fichier_patient","r");
  if (f!=NULL)
	{
         while(fread(&p,sizeof(patient),1,f)!=0 && res==0)
 	    {
	      if(pa->cin==p.cin)
	       res=1;
 	    }
 	}
return res;
}


/*********************************************************************************************************************************************/
/*Fonction pour tester  le nbr de jours d'un mois */
/*********************************************************************************************************************************************/

int test(patient *pa,date d)
{
	int test=0;
	if((d.mois==4)||(d.mois==6)||(d.mois==9)||(d.mois==11))
		{
		if(d.jour>30)
			{test=1;}
		}
	else if ((d.mois==2)&&(test==0))
		{
		if(d.jour>29)
			{test=1;}
		}
	else
		if(d.jour>31)
			{test=1;}
return test;
}


/*********************************************************************************************************************************************/
/*Fonction pour comparer deux dates (type date)*/
/*********************************************************************************************************************************************/
int comparer_date(patient *pa )
{
    int comp=0;
    if(pa->date_entre.annee<pa->date_sortie.annee)
    {
        comp=1;
    }
    else if (pa->date_entre.annee==pa->date_sortie.annee)
    {
        if (pa->date_entre.mois<pa->date_sortie.mois)
        {
            comp=1;
        }
        else if (pa->date_entre.mois==pa->date_sortie.mois)
        {
            if (pa->date_entre.jour<pa->date_sortie.jour)
            {
                comp=1;
            }
        }
    }
    return comp;
}


/*********************************************************************************************************************************************/
/*Fonction pour controler le nombre de chiffre d'un entier*/
/*********************************************************************************************************************************************/
int longueur(int nbr)
{
    int l= 0;

    while(nbr !=0)
    {
        l++;
        nbr = nbr / 10;
    }
    return l;
}


/*********************************************************************************************************************************************/
/*Fonction pour saisir les champs d'un patient*/
/*********************************************************************************************************************************************/

void saisir_patient(patient *pa)
{
    int c=0;
    int l=0;
    int l1=0;
    int l2=0;
    int test_naissance=0;
    int test_contamination=0;
    int test_entre=0;
    int test_sortie=0;
    int comp=0;

    printf("\n\t\t\t\t\tVeuillez SVP donner le nom du patient:\n");
    fflush(stdin);
    scanf("%s",pa->nom);
    printf("\n\t\t\t\t\tVeuillez SVP donner donner le prenom du patient:\n");
    fflush(stdin);
    scanf("%s",pa->prenom);

    do
    {
        printf("\n\t\t\t\t\tVeuillez SVP donner donnez le numero du telephone du patient: \n");
        scanf("%d",&(pa->telephone));
        l=longueur(pa->telephone);
if (l!=8) 
{printf ("le nombre de numeros doit etre egal a 8");}
    }
    while ((pa->telephone<0) || (l!=8));

    do
    {
        printf("\n\t\t\t\t\tVeuillez SVP donner donner le cin du patient:\n");
        scanf("%d",&(pa->cin));
        l1=longueur(pa->cin);
	comp=comparer_cin(pa);
if (l1!=7)
{printf("ne nombre de numeros doit être egal a 8 ");}
if (comp==1)
{printf ("le numero de CIN insere existe deja"); }
    }
    while ((pa->cin<0) || (l1!=7)||(comp==1));

    do
    {
        printf("\n\t\t\t\t\tVeuillez SVP donner donner la date du naissance du patient:\n");
        printf("\n\n \t\t Jour : ");
        scanf("%d",&(pa->date_naissance.jour));
        printf("\n \t\t Mois : ");
        scanf("%d",&(pa->date_naissance.mois));
        printf("\n \t\t Annee : ");
        scanf("%d",&(pa->date_naissance.annee));
        l2=longueur(pa->date_naissance.annee);
	test_naissance=test(pa,pa->date_naissance);
if(l2!=4)
{printf("erreur de saisie *annee");}

if (test_naissance==1)	
{printf("erreur de saisie *jour ");}
    }
    while ((pa->date_naissance.jour<0)||(pa->date_naissance.jour>31)||(pa->date_naissance.mois<0)||(pa->date_naissance.mois>12)||(pa->date_naissance.annee<0)||(l2!=4)||(test_naissance==1));

    do
    {
        printf("\n\t\t\t\t\tVeuillez SVP donner la date de contamination du patient:\n");
        printf("\n\n \t\t Jour : ");
        scanf("%d",&(pa->date_contamination.jour));
        printf("\n \t\t Mois : ");
        scanf("%d",&(pa->date_contamination.mois));
        printf("\n \t\t Annee : ");
        scanf("%d",&(pa->date_contamination.annee));
        l2=longueur(pa->date_contamination.annee);
	test_contamination=test(pa,pa->date_contamination);
if(l2!=4)
{printf("erreur de saisie *annee");}
if (test_contamination==1)	
{printf("erreur de saisie *jour ");}
    }
    while ((pa->date_contamination.jour<0)||(pa->date_contamination.jour>31)||(pa->date_contamination.mois<0)||(pa->date_contamination.mois>12)||(pa->date_contamination.annee<0)||(l2!=4)||(test_contamination==1));

    do
    {
        printf("\n\t\t\t\t\tVeuillez SVP donner la date d'entre du patient :\n");
        printf("\n\n  \t\t Jour : ");
        scanf("%d",&(pa->date_entre.jour));
        printf("\n \t\t Mois : ");
        scanf("%d",&(pa->date_entre.mois));
        printf("\n \t\t Annee : ");
        scanf("%d",&(pa->date_entre.annee));
        l2=longueur(pa->date_entre.annee);
	test_entre=test(pa,pa->date_entre);
if(l2!=4)
{printf("erreur de saisie *annee");}
if (test_entre==1)	
{printf("erreur de saisie *jour ");}
    }
    while ((pa->date_entre.jour<0)||(pa->date_entre.jour>31)||(pa->date_entre.mois<0)||(pa->date_entre.mois>12)||(pa->date_entre.annee<0)||(l2!=4)||(test_entre==1));

    do
    {
        printf("\n\t\t\t\t\tVeuillez SVP donner la date de sortie du patient:\n");
        fflush(stdin);
        printf("\n\n \t\t Jour : ");
        scanf("%d",&(pa->date_sortie.jour));
        printf("\n \t\t Mois : ");
        scanf("%d",&(pa->date_sortie.mois));
        printf("\n \t\t Annee : ");
        scanf("%d",&(pa->date_sortie.annee));
        test_sortie=test(pa,pa->date_sortie);
        l2=longueur(pa->date_sortie.annee);
        c=comparer_date(pa);
if(l2!=4)
{printf("erreur de saisie *annee");}
if (test_sortie==1)	
{printf("erreur de saisie *jour ");}
if (c==0)
{printf("erreur de saisie date entree<datesortie");}
    }
    while ((pa->date_sortie.jour<0)||(pa->date_sortie.jour>31)||(pa->date_sortie.mois<0)||(pa->date_sortie.mois>12)||(pa->date_sortie.annee<0)||(l2!=4)||(c==0)||(test_sortie==1));
}


/*********************************************************************************************************************************************/
/*Fonction pour enregistrer les champ pré-saisi d'un patient*/
/*********************************************************************************************************************************************/


void Enregistrer_patient(char fichier_patient[],patient *pa,char fichier_matricule_patient[])
{
    FILE *m ;
    FILE *f;
    int i ;
    char ch[20];


    f = fopen(fichier_patient, "ab");

    if (f!=NULL)

    {
        m=fopen(fichier_matricule_patient,"r");


        if (m!=NULL)
        {
            fscanf(m,"%s",ch);
            i=atoi(ch);
            strcpy(pa->matricule,ch);
            i++;

        }
        fclose(m);

        m=fopen(fichier_matricule_patient,"w");
        if (m!=NULL)
        {
            fprintf(m,"%d",i);
        }
        fclose(m);

        saisir_patient(pa);
        fwrite(pa,sizeof(patient),1,f);

    }

    else

        printf("Erreur d'ouverture");


    fclose(f);
}


/*********************************************************************************************************************************************/
/*Fonction pour afficher la liste des patients*/
/*********************************************************************************************************************************************/

void afficher_patients(char fichier_patient[])
{
    FILE *f;
    patient pa;
    int i=0;



    f = fopen(fichier_patient, "rb");

    if (f!=NULL)

    {

        while(fread(&pa,sizeof(patient),1,f)!=0)
        {
            i++;
            printf("Nom: %s \nPrenom: %s \nCIN: %d \nMatricule: %s \nTelephone: %d \nDate de contamination: %d /%d/ %d\nDate de naissance:  %d /%d/ %d \nDate d'entre: %d /%d/ %d \nDate de sortie: %d /%d/ %d \n\n\n",pa.nom,pa.prenom,pa.cin,pa.matricule,pa.telephone,pa.date_contamination.jour,pa.date_contamination.mois,pa.date_contamination.annee,pa.date_naissance.jour,pa.date_naissance.mois,pa.date_naissance.annee,pa.date_entre.jour,pa.date_entre.mois,pa.date_entre.annee,pa.date_sortie.jour,pa.date_sortie.mois,pa.date_sortie.annee);
        }
    }

    else

        printf("Erreur d'ouverture");

    fclose(f);
}


/*********************************************************************************************************************************************/
/*Fonction pour chercher un patient grace a sa matricule*/
/*********************************************************************************************************************************************/


int  rechercher_patient(char fichier_patient[],char nom [],int cin,char matricule[])
{
    char nom_cherche[20];
    int CIN_cherche;
    char matricule_cherche[20];
    int exist=0;
    int choix;
    int Quit=0;
    patient pa;
    FILE *f;
    
    
    do
    {
        printf("********************************************************************************\n\n");
        printf("********************************************************************************\n\n");
        printf("***************               Menu recherche                ********************\n");
        printf("***************            1-recherche avec CIN             ********************\n");
        printf("***************            2-recherche avec nom             ********************\n");
        printf("***************            3-recherche avec matricule       ********************\n");
        printf("***************            0-retour au menu princiapl       ********************\n\n");
        printf("********************************************************************************\n");
        printf("\n\t\t\tveuillez saisir votre choix svp \n");
        scanf("%d",&choix);
        printf("********************************************************************************\n");

        switch (choix)
        {
        case 1 :
        {
            
        	f=fopen(fichier_patient, "rb");

            printf ("\n\t\t\t\t\tdonner le num de cin du patient :\n") ;
            scanf("%d",&CIN_cherche);

            if (f!=NULL)
            {exist=0;
	rewind(f);

                while(fread(&pa,sizeof(patient),1,f)!=0 && (exist!=1))

                {
                    if (CIN_cherche==pa.cin)
                    {
                        exist=1;

                        printf("\n\t\t\t\t\tle patient recherche existe \n");
                        printf(" Nom: %s \n Prenom: %s \n CIN: %d \n Matricule: %s \n Telephone: %d \nDate de contamination: %d /%d/ %d\n  Date de naissance:  %d /%d/ %d \n Date d'entre: %d /%d/ %d \n Date de sortie: %d /%d/ %d \n ",pa.nom,pa.prenom,pa.cin,pa.matricule,pa.telephone,pa.date_contamination.jour,pa.date_contamination.mois,pa.date_contamination.annee,pa.date_naissance.jour,pa.date_naissance.mois,pa.date_naissance.annee,pa.date_entre.jour,pa.date_entre.mois,pa.date_entre.annee,pa.date_sortie.jour,pa.date_sortie.mois,pa.date_sortie.annee);
                    }

                }

                if (exist==0)
                {
                    printf("\n\n\t\t\t\t\tle patient recherche n'existe pas \n");
                }
            }

            fclose(f);
	
        }
        break;


        case 2 :
        {
         	f=fopen(fichier_patient, "rb");

            printf ("\n\t\t\t\t\tdonner le nom du patient  :\n") ;
            scanf("%s",nom_cherche);

            if (f!=NULL)
            {exist=0;
	rewind(f);

                while(fread(&pa,sizeof(patient),1,f)!=0 && exist!=1)

                {
                    if (strcmp(nom_cherche,pa.nom)==0)
                    {
                        exist=1;



                        printf("\n\t\t\t\t\tle patient recherche existe \n");
                        printf(" Nom: %s \n Prenom: %s \n CIN: %d \n Matricule: %s \n  Telephone: %d \nDate de contamination: %d /%d/ %d\n  Date de naissance:  %d /%d/ %d \n Date d'entre: %d /%d/ %d \n Date de sortie: %d /%d/ %d \n ",pa.nom,pa.prenom,pa.cin,pa.matricule,pa.telephone,pa.date_contamination.jour,pa.date_contamination.mois,pa.date_contamination.annee,pa.date_naissance.jour,pa.date_naissance.mois,pa.date_naissance.annee,pa.date_entre.jour,pa.date_entre.mois,pa.date_entre.annee,pa.date_sortie.jour,pa.date_sortie.mois,pa.date_sortie.annee);
                    }
                }
                if (exist==0)
                {
                    printf("\n\t\t\t\t\tle patient recherche n'existe pas \n");
                }
            }
            fclose(f);
  
        }
        break;

        case 3 :
        {
         	 f=fopen(fichier_patient, "rb");

            printf ("\n\t\t\t\t\tdonner la matricule du patient  :\n") ;
            scanf("%s",matricule_cherche);

            if (f!=NULL)
            {exist=0;
	rewind(f);
	

                while(fread(&pa,sizeof(patient),1,f)!=0 && exist!=1)

                {
                    if (strcmp(matricule_cherche,pa.matricule)==0)
                    {
                        exist=1;

                        printf("\n\t\t\t\t\tle patient recherche existe \n");
                        printf(" Nom: %s \n Prenom: %s \n CIN: %d \n Matricule: %s \n  Telephone: %d \nDate de contamination: %d /%d/ %d\n  Date de naissance:  %d /%d/ %d \n Date d'entre: %d /%d/ %d \n Date de sortie: %d /%d/ %d \n ",pa.nom,pa.prenom,pa.cin,pa.matricule,pa.telephone,pa.date_contamination.jour,pa.date_contamination.mois,pa.date_contamination.annee,pa.date_naissance.jour,pa.date_naissance.mois,pa.date_naissance.annee,pa.date_entre.jour,pa.date_entre.mois,pa.date_entre.annee,pa.date_sortie.jour,pa.date_sortie.mois,pa.date_sortie.annee);
                    }
                }
                if (exist==0)
                {
                    printf("\n\n\t\t\t\t\tle patient recherche n'existe pas \n");
                }
            }
            fclose(f);

        }  
        break;

        case 0 :
        {
            printf("\n\n\t\t\t\t\tMerci");
            Quit=1;
        }
        break;

        default:
            printf("\n\n\t\t\t\t\t Vous avez saisi un mauvais choix");
            
        }
    }
    while (Quit==0);

    return(exist);
}

   
/*********************************************************************************************************************************************/
/*Fonction pour modifier les champs d'un patient*/
/*********************************************************************************************************************************************/

void modifier_patient(char fichier_patient[])
{
    patient pa,pat;
    int exist;
    FILE *f1,*f2;
    int choix;
    int Quit;
    int CIN_cherche;
    char nom_cherche[20];
    char matricule_cherche[20];



    f1=fopen(fichier_patient,"rb");
    f2=fopen("tmp.txt","ab");

    if ((f1!=NULL) && (f2!=NULL))
    {
		do
    {
        printf("********************************************************************************\n\n");
        printf("********************************************************************************\n\n");
        printf("***************               Menu recherche                ********************\n");
        printf("***************            1- CIN             ********************\n");
        printf("***************            2- nom             ********************\n");
        printf("***************            3- matricule       ********************\n");
        printf("***************            0-retour au menu princiapl       ********************\n\n");
        printf("********************************************************************************\n");
        printf("\n\t\t\tveuillez saisir votre choix svp \n");
        scanf("%d",&choix);
        printf("********************************************************************************\n");

        switch (choix)
        {
        case 1 :
        {
            
            printf ("\n\t\t\t\t\tdonner le num de cin du patient :\n") ;
            scanf("%d",&CIN_cherche);
	    exist=0;
	    rewind(f1);
	    rewind(f2);
                while(fread(&pa,sizeof(patient),1,f1)!=0 && (exist!=1))

                {
                    if (CIN_cherche==pa.cin)
                    {
                        exist=1;

                        printf("\n\t\t\t\t\tle patient recherche existe \n");
                        printf(" Nom: %s \n Prenom: %s \n CIN: %d \n Matricule: %s \n Telephone: %d \nDate de contamination: %d /%d/ %d\n  Date de naissance:  %d /%d/ %d \n Date d'entre: %d /%d/ %d \n Date de sortie: %d /%d/ %d \n ",pa.nom,pa.prenom,pa.cin,pa.matricule,pa.telephone,pa.date_contamination.jour,pa.date_contamination.mois,pa.date_contamination.annee,pa.date_naissance.jour,pa.date_naissance.mois,pa.date_naissance.annee,pa.date_entre.jour,pa.date_entre.mois,pa.date_entre.annee,pa.date_sortie.jour,pa.date_sortie.mois,pa.date_sortie.annee);
                        saisir_patient(&pa);
                        fwrite(&pa,sizeof(patient),1,f2); 
                    }
                else 
		    {
		         exist=0;
		         fwrite(&pa,sizeof(patient),1,f2);
		    }
              }
	if(exist!=1)
		{
			printf("\n\t\t\t\t\tle personnel recherche n \'existe pas \n");
			
		}
        }
        break;


        case 2 :
        {
         	printf ("\n\t\t\t\t\tdonner le nom du patient  :\n") ;
            scanf("%s",nom_cherche);

            
                while(fread(&pa,sizeof(patient),1,f1)!=0 && exist!=1)

                {
                    if (strcmp(nom_cherche,pa.nom)==0)
                    {
                        exist=1;

                        printf("\n\t\t\t\t\tle patient recherche existe \n");
                        printf(" Nom: %s \n Prenom: %s \n CIN: %d \n Matricule: %s \n  Telephone: %d \nDate de contamination: %d /%d/ %d\n  Date de naissance:  %d /%d/ %d \n Date d'entre: %d /%d/ %d \n Date de sortie: %d /%d/ %d \n ",pa.nom,pa.prenom,pa.cin,pa.matricule,pa.telephone,pa.date_contamination.jour,pa.date_contamination.mois,pa.date_contamination.annee,pa.date_naissance.jour,pa.date_naissance.mois,pa.date_naissance.annee,pa.date_entre.jour,pa.date_entre.mois,pa.date_entre.annee,pa.date_sortie.jour,pa.date_sortie.mois,pa.date_sortie.annee);
                        saisir_patient(&pa);
                        fwrite(&pa,sizeof(patient),1,f2); 
                    }
                else 
		    {
		         exist=0;
		         fwrite(&pa,sizeof(patient),1,f2);
		    }
              }
	if(exist!=1)
		{
			printf("\n\t\t\t\t\tle personnel recherche n \'existe pas \n");
			
		}
        }
        break;

        case 3 :
        {
         	printf ("\n\t\t\t\t\tdonner la matricule du patient  :\n") ;
            scanf("%s",matricule_cherche);

           

                while((fread(&pa,sizeof(patient),1,f1)!=0) &&  (exist!=1))

                {
                    if (strcmp(matricule_cherche,pa.matricule)==0)
                    {
                        exist=1;

                        printf("\n\t\t\t\t\tle patient recherche existe \n");
                        printf(" Nom: %s \n Prenom: %s \n CIN: %d \n Matricule: %s \n  Telephone: %d \nDate de contamination: %d /%d/ %d\n  Date de naissance:  %d /%d/ %d \n Date d'entre: %d /%d/ %d \n Date de sortie: %d /%d/ %d \n ",pa.nom,pa.prenom,pa.cin,pa.matricule,pa.telephone,pa.date_contamination.jour,pa.date_contamination.mois,pa.date_contamination.annee,pa.date_naissance.jour,pa.date_naissance.mois,pa.date_naissance.annee,pa.date_entre.jour,pa.date_entre.mois,pa.date_entre.annee,pa.date_sortie.jour,pa.date_sortie.mois,pa.date_sortie.annee);
			saisir_patient(&pa);
                        fwrite(&pa,sizeof(patient),1,f2);                    
                   }
                
                    else 
		    {
		         exist=0;
		         fwrite(&pa,sizeof(patient),1,f2);
		    }
             }
           
	if(exist!=1)
		{
			printf("\n\t\t\t\t\tle personnel recherche n \'existe pas \n");
			
		}     
        }  
        break;

        case 0 :
        {
            printf("\n\n\t\t\t\t\tMerci");
            Quit=1;
        }
        break;

        default:
            printf("\n\n\t\t\t\t\t Vous avez saisi un mauvais choix");
            break;
        }
    }
    while (Quit==0);

        
    }
    fclose(f1);
    fclose(f2);

    remove(fichier_patient);

    f1=fopen(fichier_patient, "ab");
    f2=fopen("tmp.txt", "rb");

    if ((f2!=NULL)&&(f1!=NULL))
    {

        while(fread(&pat,sizeof(patient),1,f2)!=0)

        {

            fwrite(&pat,sizeof(patient),1,f1);

        }

    }
    fclose(f1);
    fclose(f2);

    remove("tmp.txt");

}





/*********************************************************************************************************************************************/
/*Fonction pour archiver les champs d'un patient*/
/*********************************************************************************************************************************************/

void archiver_patient(char fichier_patient[],char archive_patient[])
{
    int i;
    patient pa,pat;

    FILE *f1,*f2,*f3;
    char matricule_cherche[20];


    printf ("\n\t\t\t\t\tdonner la matricule\n") ;

    scanf("%s",matricule_cherche);

    f1=fopen(fichier_patient,"rb");
    f2=fopen("tmp.txt","ab");
    f3=fopen(archive_patient, "ab");


    if ((f1!=NULL) && (f2!=NULL) && (f3!=NULL))
    {

        while(fread(&pa,sizeof(patient),1,f1)!=0)

        {
            if (strcmp(matricule_cherche,pa.matricule)!=0)
            {

                fwrite(&pa,sizeof(patient),1,f2);
            }
            else
            {

                fwrite(&pa,sizeof(patient),1,f3);
            }

        }

    }
    fclose(f1);
    fclose(f2);
    fclose(f3);

    printf("\n****************************\n");
    printf("\nListe des patients archivés:\n");
    printf("\n****************************\n");
    afficher_patients(archive_patient);

    remove(fichier_patient);

    f1=fopen(fichier_patient, "ab");
    f2=fopen("tmp.txt", "rb");

    if ((f2!=NULL)&&(f1!=NULL))
    {

        while(fread(&pat,sizeof(patient),1,f2)!=0)

        {
            if (strcmp(matricule_cherche,pat.matricule)!=0)
            {

                fwrite(&pat,sizeof(patient),1,f1);
            }

        }

    }
    fclose(f1);
    fclose(f2);

    printf("\n*******************\n");
    printf("\nListe des patients:\n");
    printf("\n*******************\n");
    afficher_patients(fichier_patient);
    remove("tmp.txt");

}




/*********************************************************************************************************************************************/
/*Fonction pour afficher la liste des patients archivés*/
/*********************************************************************************************************************************************/

void afficher_patients_archives(char archive_patient[])
{
    FILE *f;
    patient pa;
    int i=0;



    f = fopen(archive_patient, "rb");

    if (f!=NULL)

    {

        while(fread(&pa,sizeof(patient),1,f)!=0)
        {
            i++;
            printf("\n Patient %d  :\n Nom: %s \n Prenom: %s \n  Matricule: %s \n  Telephone: %d   \n Date de naissance:  %d /%d/ %d \n ",i,pa.nom,pa.prenom,pa.matricule,pa.telephone,pa.date_naissance.jour,pa.date_naissance.mois,pa.date_naissance.annee);
        }
    }

    else

        printf("Erreur d'ouverture");

    fclose(f);
}


/*********************************************************************************************************************************************/
/*Fonction pour initialiser la liste des patients */
/*********************************************************************************************************************************************/

void initialiser_patient(char fichier[])
{
 	FILE *f;
	FILE *m;
 	f=fopen(fichier,"wb");
 	fclose(f);
	m=fopen("fichier_matricule_patient","wb");
	fwrite("1",4,1,m);
	fclose(m);
}


/*********************************************************************************************************************************************/
/*Fonction pour initialiser la liste des patients archivés */
/*********************************************************************************************************************************************/

void initialiser_patient_archive(char fichier[])
{
 	FILE *f;
	
 	f=fopen(fichier,"wb");
 	fclose(f);
	
}


